# -*- coding: utf-8 -*-
"""
分类模型
目的：定义文章分类数据结构，映射数据库categories表
职责：管理文章分类的属性和层级关系，支持多级分类功能
"""
from sqlalchemy import Column, Integer, String, Text, DateTime, SmallInteger
from sqlalchemy.sql import func
from app.models.user import Base


class Category(Base):
    """
    分类数据模型类
    目的：表示博客系统中的文章分类实体，支持树形结构的多级分类
    职责：定义分类字段、提供分类层级管理和序列化功能
    使用场景：文章分类管理、分类筛选、分类导航等功能
    """
    __tablename__ = 'categories'

    # 主键字段，分类的唯一标识符
    id = Column(Integer, primary_key=True, autoincrement=True, comment='分类唯一标识符')

    # 分类基本信息字段
    name = Column(String(100), nullable=False, comment='分类名称')
    description = Column(Text, nullable=True, comment='分类描述')

    # 层级关系字段，支持多级分类结构
    parent_id = Column(Integer, nullable=True, comment='父分类ID，支持多级分类，NULL表示顶级分类')

    # 排序和状态字段
    sort_order = Column(Integer, nullable=False, default=0, comment='排序顺序，数字越小越靠前')
    status = Column(SmallInteger, nullable=False, default=1, comment='分类状态：0-禁用，1-启用')

    # 时间字段
    created_at = Column(DateTime, nullable=False, default=func.now(), comment='创建时间')
    updated_at = Column(DateTime, nullable=False, default=func.now(),
                       onupdate=func.now(), comment='更新时间')

    def to_dict(self):
        """
        将分类对象转换为字典格式
        目的：提供分类数据的序列化方法，用于API响应
        功能：将SQLAlchemy模型对象转换为可JSON序列化的字典

        Returns:
            dict: 包含分类所有字段的字典，时间字段转换为ISO格式字符串
        """
        return {
            'id': self.id,
            'name': self.name,
            'description': self.description,
            'parent_id': self.parent_id,
            'sort_order': self.sort_order,
            'status': self.status,
            'created_at': self.created_at.isoformat() if self.created_at else None,
            'updated_at': self.updated_at.isoformat() if self.updated_at else None
        }
